From 1c5c1e73accb9321a2f5ddc6740f7036902753f9 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Fri, 29 Jul 2005 10:23:07 +0000 Subject: [PATCH] Really just basic preparation: switch over PAE builds to the new shadow code, drop old dummy functions, add (fewer) new ones. --- xen/arch/x86/Makefile | 17 +++++-- xen/arch/x86/shadow.c | 17 +++++-- xen/arch/x86/vmx.c | 2 +- xen/arch/x86/vmx_platform.c | 2 +- xen/include/asm-x86/shadow.h | 78 +---------------------------- xen/include/asm-x86/shadow_64.h | 2 + xen/include/asm-x86/shadow_public.h | 12 +++-- 7 files changed, 38 insertions(+), 92 deletions(-) diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile index 251eb8894b..58fb5617ea 100644 --- a/xen/arch/x86/Makefile +++ b/xen/arch/x86/Makefile @@ -13,11 +13,18 @@ OBJS := $(subst cpu/centaur.o,,$(OBJS)) OBJS := $(subst cpu/cyrix.o,,$(OBJS)) OBJS := $(subst cpu/rise.o,,$(OBJS)) OBJS := $(subst cpu/transmeta.o,,$(OBJS)) -OBJS := $(subst shadow32.o,,$(OBJS)) -else -OBJS := $(subst shadow.o,,$(OBJS)) -OBJS := $(subst shadow_public.o,,$(OBJS)) -OBJS := $(subst shadow_xxx.o,,$(OBJS)) +endif + +OBJS := $(patsubst shadow%.o,,$(OBJS)) # drop all +ifeq ($(TARGET_SUBARCH),x86_64) + OBJS += shadow.o shadow_public.o # x86_64: new code +endif +ifeq ($(TARGET_SUBARCH),x86_32) + ifneq ($(pae),n) + OBJS += shadow.o shadow_public.o # x86_32p: new code + else + OBJS += shadow32.o # x86_32: old code + endif endif OBJS := $(subst $(TARGET_SUBARCH)/asm-offsets.o,,$(OBJS)) diff --git a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c index 3f172d8647..4e58d3f747 100644 --- a/xen/arch/x86/shadow.c +++ b/xen/arch/x86/shadow.c @@ -41,7 +41,13 @@ extern void free_shadow_pages(struct domain *d); static void mark_shadows_as_reflecting_snapshot(struct domain *d, unsigned long gpfn); #endif -#if CONFIG_PAGING_LEVELS >= 4 +#if CONFIG_PAGING_LEVELS == 3 +#include +static unsigned long shadow_l3_table( + struct domain *d, unsigned long gpfn, unsigned long gmfn); +#endif + +#if CONFIG_PAGING_LEVELS == 4 #include static unsigned long shadow_l4_table( struct domain *d, unsigned long gpfn, unsigned long gmfn); @@ -1833,7 +1839,7 @@ static void shadow_update_pagetables(struct vcpu *v) unsigned long gpfn = __mfn_to_gpfn(d, gmfn); unsigned long smfn, old_smfn; -#if defined (__i386__) +#if CONFIG_PAGING_LEVELS == 2 unsigned long hl2mfn; #endif @@ -1890,7 +1896,7 @@ static void shadow_update_pagetables(struct vcpu *v) v->arch.shadow_vtable = map_domain_page(smfn); } -#if defined (__i386__) +#if CONFIG_PAGING_LEVELS == 2 /* * arch.hl2_vtable */ @@ -1936,6 +1942,10 @@ static void shadow_update_pagetables(struct vcpu *v) local_flush_tlb(); } #endif + +#if CONFIG_PAGING_LEVELS == 3 + /* FIXME: PAE code to be written */ +#endif } struct shadow_ops MODE_A_HANDLER = { @@ -2427,6 +2437,7 @@ static unsigned long shadow_l3_table( struct domain *d, unsigned long gpfn, unsigned long gmfn) { BUG(); /* not implemenated yet */ + return 42; } #endif diff --git a/xen/arch/x86/vmx.c b/xen/arch/x86/vmx.c index 714049ae11..bf9fc928df 100644 --- a/xen/arch/x86/vmx.c +++ b/xen/arch/x86/vmx.c @@ -38,7 +38,7 @@ #include #include #include -#if CONFIG_PAGING_LEVELS >= 4 +#if CONFIG_PAGING_LEVELS >= 3 #include #endif diff --git a/xen/arch/x86/vmx_platform.c b/xen/arch/x86/vmx_platform.c index fc6a54402f..34b7d8e6f8 100644 --- a/xen/arch/x86/vmx_platform.c +++ b/xen/arch/x86/vmx_platform.c @@ -32,7 +32,7 @@ #include #include #include -#if CONFIG_PAGING_LEVELS >= 4 +#if CONFIG_PAGING_LEVELS >= 3 #include #endif #ifdef CONFIG_VMX diff --git a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h index 2ead58f983..399d1d6371 100644 --- a/xen/include/asm-x86/shadow.h +++ b/xen/include/asm-x86/shadow.h @@ -131,12 +131,12 @@ extern void shadow_l2_normal_pt_update(struct domain *d, unsigned long pa, l2_pgentry_t l2e, struct domain_mmap_cache *cache); #if CONFIG_PAGING_LEVELS >= 3 +#include extern void shadow_l3_normal_pt_update(struct domain *d, unsigned long pa, l3_pgentry_t l3e, struct domain_mmap_cache *cache); #endif #if CONFIG_PAGING_LEVELS >= 4 -#include extern void shadow_l4_normal_pt_update(struct domain *d, unsigned long pa, l4_pgentry_t l4e, struct domain_mmap_cache *cache); @@ -631,82 +631,6 @@ static inline void shadow_sync_and_drop_references( } #endif -#if CONFIG_PAGING_LEVELS == 3 -/* dummy functions, PAE has no shadow support yet */ - -static inline void -__shadow_get_l2e( - struct vcpu *v, unsigned long va, l2_pgentry_t *psl2e) -{ - BUG(); -} - -static inline void -__shadow_set_l2e( - struct vcpu *v, unsigned long va, l2_pgentry_t value) -{ - BUG(); -} - -static inline void -__guest_get_l2e( - struct vcpu *v, unsigned long va, l2_pgentry_t *pl2e) -{ - BUG(); -} - -static inline void -__guest_set_l2e( - struct vcpu *v, unsigned long va, l2_pgentry_t value) -{ - BUG(); -} - -static inline void shadow_drop_references( - struct domain *d, struct pfn_info *page) -{ - if ( likely(!shadow_mode_refcounts(d)) || - ((page->u.inuse.type_info & PGT_count_mask) == 0) ) - return; - BUG(); -} - -static inline void shadow_sync_and_drop_references( - struct domain *d, struct pfn_info *page) -{ - if ( likely(!shadow_mode_refcounts(d)) ) - return; - BUG(); -} - -static inline int l1pte_write_fault( - struct vcpu *v, l1_pgentry_t *gpte_p, l1_pgentry_t *spte_p, - unsigned long va) -{ - BUG(); - return 42; -} - -static inline int l1pte_read_fault( - struct domain *d, l1_pgentry_t *gpte_p, l1_pgentry_t *spte_p) -{ - BUG(); - return 42; -} - -void static inline -shadow_set_l1e(unsigned long va, l1_pgentry_t new_spte, int create_l1_shadow) -{ - BUG(); -} - -static inline unsigned long gva_to_gpa(unsigned long gva) -{ - BUG(); - return 42; -} -#endif - /************************************************************************/ /* diff --git a/xen/include/asm-x86/shadow_64.h b/xen/include/asm-x86/shadow_64.h index fc0aeb0db8..524d1ef85c 100644 --- a/xen/include/asm-x86/shadow_64.h +++ b/xen/include/asm-x86/shadow_64.h @@ -85,8 +85,10 @@ static inline int table_offset_64(unsigned long va, int level) return (((va) >> L2_PAGETABLE_SHIFT) & (L2_PAGETABLE_ENTRIES - 1)); case 3: return (((va) >> L3_PAGETABLE_SHIFT) & (L3_PAGETABLE_ENTRIES - 1)); +#if CONFIG_PAGING_LEVELS >= 4 case 4: return (((va) >> L4_PAGETABLE_SHIFT) & (L4_PAGETABLE_ENTRIES - 1)); +#endif default: //printk(" level %d is too big\n", level); return -1; diff --git a/xen/include/asm-x86/shadow_public.h b/xen/include/asm-x86/shadow_public.h index 161a0d42bb..615573a222 100644 --- a/xen/include/asm-x86/shadow_public.h +++ b/xen/include/asm-x86/shadow_public.h @@ -21,7 +21,7 @@ #ifndef _XEN_SHADOW_PUBLIC_H #define _XEN_SHADOW_PUBLIC_H -#if CONFIG_PAGING_LEVELS >= 4 +#if CONFIG_PAGING_LEVELS >= 3 #define MFN_PINNED(_x) (frame_table[_x].u.inuse.type_info & PGT_pinned) extern int alloc_p2m_table(struct domain *d); @@ -31,10 +31,6 @@ extern void shadow_sync_and_drop_references( extern void shadow_drop_references( struct domain *d, struct pfn_info *page); -extern void shadow_l4_normal_pt_update(struct domain *d, - unsigned long pa, l4_pgentry_t l4e, - struct domain_mmap_cache *cache); - extern int shadow_set_guest_paging_levels(struct domain *d, int levels); extern void release_out_of_sync_entry( @@ -56,4 +52,10 @@ struct shadow_ops { }; #endif +#if CONFIG_PAGING_LEVELS >= 4 +extern void shadow_l4_normal_pt_update(struct domain *d, + unsigned long pa, l4_pgentry_t l4e, + struct domain_mmap_cache *cache); +#endif + #endif -- 2.30.2